package com.stsdai.manager.controller;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.stsdai.common.pojo.PicUploadResult;

@Controller
@RequestMapping("pic/upload")
public class PicUploadController {

	// json格式数据处理的工具类。我们要使用3个功能：1.对象转json；2.json转对象；3.直接解析json
	private static final ObjectMapper MAPPER = new ObjectMapper();

	@Value("${IMAGE_SERVER_URL}")
	private String url;

	// 声明可以上传的图片的类型
	private String[] TYPE = { ".jpg", ".png", ".gif", ".jpeg", ".bmp" };

	// Request URL:http://manager.stsdai.com/rest/pic/upload?dir=image
	// Request Method:POST
	// Content-Disposition: form-data; name="uploadFile"; filename="黑夜传说2进化.jpg"

	// filePostName : "uploadFile", //图片上传的文件名
	// uploadJson : '/rest/pic/upload', //图片上传的路径
	// dir : "image" //文件的类型，这里是图片

	@RequestMapping(method = RequestMethod.POST, produces = MediaType.TEXT_HTML_VALUE)
	@ResponseBody
	public String upload(MultipartFile uploadFile) throws Exception {
		// 声明返回对象，默认上传失败
		PicUploadResult picUploadResult = new PicUploadResult();
		// error：0上传成功，1代表上传失败
		picUploadResult.setError(1);

		// 声明标识位，校验时候使用，默认校验失败
		boolean flag = false;

		// 文件类型校验，后缀校验
		for (String type : TYPE) {
			// 判断是否是要求的后缀结尾
			if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
				// 如果是要求的后缀结果，设置标识位为true
				flag = true;

				// 跳出循环
				break;
			}
		}

		// 如果校验失败，则直接返回
		// if(flag==false){
		if (!flag) {
			// 直接返回结果对象
			// return picUploadResult;
			// 需要把对象转为json格式的数据
			String json = MAPPER.writeValueAsString(picUploadResult);
			return json;
		}

		// 进行下一个校验，需要重置标识位
		flag = false;

		// 文件内容校验，校验图片的宽和高
		try {
			BufferedImage image = ImageIO.read(uploadFile.getInputStream());
			if (image != null) {
				// 设置宽和高
				picUploadResult.setWidth("" + image.getWidth());
				picUploadResult.setHeight(String.valueOf(image.getHeight()));

				// 如果到这里都没有问题，就表示校验成功，设置标志位为true
				flag = true;
			}

		} catch (Exception e) {
			// 这里就是在校验，如果有异常，表示校验失败，目的达到，不需要处理异常
		}

		// 判断是否校验成功
		// if(flag==true ){
		if (flag) {
			// 如果校验成功，执行图片上传
			// 1. 初始化图片上传，加载配置文件
			ClientGlobal.init(System.getProperty("user.dir") + "/src/main/resources/tracker.conf");

			// 2. 创建TrackerClient，直接new即可
			TrackerClient trackerClient = new TrackerClient();

			// 3. 使用TrackerClient获取TrackerServer
			TrackerServer trackerServer = trackerClient.getConnection();

			// 4. 声明StorageServer，声明为null
			StorageServer storageServer = null;

			// 5. 创建StorageClient，用来上传图片
			StorageClient storageClient = new StorageClient(trackerServer, storageServer);

			// 获取上传文件名的后缀1.2.3.4.jpg
			String extName = StringUtils.substringAfterLast(uploadFile.getOriginalFilename(), ".");
			// 6. 使用StorageClient，上传图片，返回字符串数组
			String[] str = storageClient.upload_file(uploadFile.getBytes(), extName, null);

			// 7. 拼接图片的url
			String picUrl = this.url + str[0] + "/" + str[1];

			// 设置数据给返回对象
			picUploadResult.setUrl(picUrl);

			// 设置为上传成功
			// error：0上传成功，1代表上传失败
			picUploadResult.setError(0);

		}

		// 返回结果对象
		// return picUploadResult;
		// 需要把对象转为json格式的数据
		String json = MAPPER.writeValueAsString(picUploadResult);
		return json;

	}

}
